/*
	它拥有不同的值，具体取决于它的使用位置：
	1.在方法中，this 指的是所有者对象。
	2.单独的情况下，this 指的是全局对象。
	3.在普通函数中，this 指的是全局对象。
	4.在函数中，严格模式下，this 是 undefined。(省略)
	5.在事件中，this 指的是接收事件的元素。（DOM）
	6.像 call() 和 apply() 这样的方法可以将 this 引用到任何对象。(可以改变this的指向)
*/

console.log(this); // window

function myFunction() {
	console.log(this); // window
}

window.myFunction();
myFunction();

/*

	onchange			HTML 元素已被改变
	onclick				用户点击了 HTML 元素
	onmouseover			用户把鼠标移动到 HTML 元素上
	onmouseout			用户把鼠标移开 HTML 元素
	onkeydown			用户按下键盘按键
	onload				浏览器已经完成页面加载

*/


// 箭头函数的this
// 对于箭头函数，this 关键字始终表示定义箭头函数的对象


let myFunction1 = () => {
	console.log(this); // window
}

myFunction1();


// 如果是普通函数 this指的就是谁调用 指向谁 如果是箭头函数，this指的谁定义就是谁，从外层继承过来的this 因为es6中的箭头函数没有this的绑定机制


let person = {
	name: "zhangsan",
	eat: function() {
		console.log(this); // person
		console.log(this.name);
	},
	drink: () => {
		console.log(this); // window
	},
	run: function() {
		let myFunction = () => {
			console.log(this); // person
		}
		myFunction();
	},
	sleep: () => {
		let myFunction = () => {
			console.log(this); // window
		}
		myFunction();
	}

}

person.eat();
person.drink();
person.run();
person.sleep();


// 函数Call-------------------------------------------------------------------
let person1 = {
    fullName: function() {
    	console.log(this);
        return this.firstName + " " + this.lastName;
    },
     fullName1: function(city, country) {
    	return this.firstName + " " + this.lastName + "," + city + "," + country;
  	}
}
let person2 = {
    firstName:"Bill",
    lastName: "Gates",
}
let person3= {
    firstName:"Steve",
    lastName: "Jobs",
}
console.log(person1.fullName.call(person2));  // 将返回 "Bill Gates"
console.log(person1.fullName1.call(person2, "tianjin", "China"));

// 函数Apply-------------------------------------------------------------------

console.log(person1.fullName.apply(person2));
console.log(person1.fullName1.apply(person2, ["tianjin", "China"]));

// 不同之处是：
// call() 方法分别接受参数。
// apply() 方法接受数组形式的参数。
// 如果要使用数组而不是参数列表，则 apply() 方法非常方便。

// bind解决this丢失问题
function myFunction2() {
	console.log(this); //window
}

let person4 = {
	name: "zhangsan",
	age: 1
}

let myFunction3 = myFunction2.bind(person4);
myFunction3();










